// 作用 ： 实现两个自定义数据类型相加的运算
//加号运算符重载 ： 1. 成员函数重载 +  2. 全局函数重载 +

#include <iostream>
using namespace std;

class Person {
public:
    // 1. 成员函数重载 +
    Person operator+ (const Person & p) {
        Person pTemp;
        pTemp.m_A = this -> m_A + p.m_A;
        pTemp.m_B = this -> m_B + p.m_B;
        return pTemp;
     }

    //此方法 也可以实现加法运算，但是会改变p1的值，所以不建议使用
     // Person operator+ (const Person & p) {
     //     this -> m_A += p.m_A;
     //     this -> m_B += p.m_B;
     //     return *this;
     // }
    int m_A;
    int m_B;
};

// 2. 全局函数重载 +
Person operator+ (Person & p1 , Person & p2) {
    Person temp;
    temp.m_A = p1.m_A + p2.m_A;
    temp.m_B = p1.m_B + p2.m_B;
    return temp;
}

// 全局函数方式实现 重载 -
 Person operator-(const Person & p1 , Person & p2) {
    Person temp;
    temp.m_A = p1.m_A - p2.m_A;
    temp.m_B = p1.m_B - p2.m_B;
    return temp;
}

// 全局函数方式实现 重载 *
Person operator* (const Person & p1 , Person & p2) {
    Person temp;
    temp.m_A = p1.m_A * p2.m_A;
    temp.m_B = p1.m_B * p2.m_B;
    return temp;
}

// 全局函数方式实现 重载 /
Person operator/ (const Person & p1 , const Person & p2) {
    Person temp;
    if (p2.m_A != 0) temp.m_A = p1.m_A / p2.m_A;
    else temp.m_A = 0;
    if (p2.m_B != 0) temp.m_B = p1.m_B / p2.m_B;
    else temp.m_B = 0;

    return temp;
}

//运算符重载
Person operator+ (Person & p , int num) {
    Person temp;
    temp.m_A = p.m_A + num;
    temp.m_B = p.m_B + num;
    return temp;
}
void test01() {
    Person p1;
    p1.m_A = 10;
    p1.m_B = 20;
    Person p2;
    p2.m_A = 10;
    p2.m_B = 10;

    // 成员函数调用的本质 ：
   // Person p3 = p1.operator+(p2);

    // 全局函数调用的本质：
    //Person p3 = operator+(p1 , p2);

    // 两个都可以简化为：
   Person p3 = p1 + p2;

    //运算符重载 也可以发生函数重载
    Person p4 = p1 + 28;

    cout << "p3.m_A = " << p3.m_A << endl;
    cout << "p3.m_B = " << p3.m_B << endl;
    cout << "p4.m_A = " << p4.m_A << endl;
    cout << "p4.m_B = " << p4.m_B << endl;

    Person p5 = p1 - p2;
    cout << "p5.m_A = " << p5.m_A << endl;
    cout << "p5.m_B = " << p5.m_B << endl;

    Person p6 = p1 * p2;
    cout << "p6.m_A = " << p6.m_A << endl;
    cout << "p6.m_B = " << p6.m_B << endl;

    Person p7 = p1 / p2;
    cout << "p7.m_A = " << p7.m_A << endl;
    cout << "p7.m_B = " << p7.m_B << endl;
}

int main(){
    test01();
    return 0;
}